package com.baizhi.bigdecimal;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 精密计算加减乘除
 * BigDecimal
 */
public class BigDecimalDemo {
    public static void main(String[] args) {

        //浮点型运算的时候，可能会出现数据失真， 浮点型数据不适合精密运算
        System.out.println(0.09+0.01); //0.1
        System.out.println(1.0-0.32);  //0.68
        System.out.println(1.015*100); // 101.5
        System.out.println(1.301/100); // 0.01301

        System.out.println("================");

        //加法

        //1. 创建BigDecimal对象   BigDecimal(double val)  如果一个类提供了静态方法创建对象，那么我们选用静态方法，尽量不用构造方法
        //BigDecimal类提供了构造方法，但是用构造方法创建对象计算依然存在数据失真问题，所以我们选择其提供的静态方法
        //BigDecimal a = new BigDecimal(0.09);
        //BigDecimal b = new BigDecimal(0.01);
        /*
            static  BigDecimal valueOf(long val)   将 double 转换为 BigDecimal
         */
        BigDecimal a1 = BigDecimal.valueOf(0.09);
        BigDecimal b1 = BigDecimal.valueOf(0.01);

        BigDecimal add = a1.add(b1);
        System.out.println(add);


        //减法
        BigDecimal a2 = BigDecimal.valueOf(1.0);
        BigDecimal b2 = BigDecimal.valueOf(0.32);

        BigDecimal subtract = a2.subtract(b2);
        System.out.println(subtract);

        System.out.println(BigDecimal.valueOf(1.0).subtract(BigDecimal.valueOf(0.32)));

        //乘法
        System.out.println(BigDecimal.valueOf(1.015).multiply(BigDecimal.valueOf(100)));
        //除法
        System.out.println(BigDecimal.valueOf(1.301).divide(BigDecimal.valueOf(100)));

        /*
          BigDecimal 是一定要进行精确运算的，如果无法精确运算会抛出异常 ArithmeticException
          public BigDecimal divide(BigDecimal divisor,
                         int scale,
                         RoundingMode roundingMode)
         */
        BigDecimal m = BigDecimal.valueOf(10);
        BigDecimal n = BigDecimal.valueOf(3);
        //BigDecimal divide = m.divide(n,2, RoundingMode.HALF_UP); //四舍五入保留两位小数
        BigDecimal divide = m.divide(n,2, RoundingMode.FLOOR); //，保留两位小数
        System.out.println(divide);

        System.out.println(10/3);//不精确


    }
}
